/*
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */

import Request from 'luch-request'
import api from './api'
import { getErrorCode, ErrorCodeKey, errorCode } from './errorCode'

const getTokenStorage = () => {
	let token = ''
	try {
		token = uni.getStorageSync('token')
	} catch (e) { }
	return token
}

const http = new Request()
http.setConfig((config) => {
	/* 设置全局配置 */
	config.baseURL = api.HOST
	config.header = {
		...config.header
	}
	config.validateStatus = (statusCode: number) => {
		return statusCode === 200
	}
	return config

})

/**
 * 自定义验证器，如果返回true 则进入响应拦截器的响应成功函数(resolve)，否则进入响应拦截器的响应错误函数(reject)
 * @param { Number } statusCode - 请求响应体statusCode（只读）
 * @return { Boolean } 如果为true,则 resolve, 否则 reject
 */
// 有默认，非必写
// http.validateStatus = (statusCode:number) => {
// 	return statusCode === 200
// }
http.interceptors.request.use((config) => {
	/* 请求之前拦截器。可以使用async await 做异步操作 */
	uni.showLoading({
		mask: true,
		title: '加载中'
	});
	config.header = {
		"sys-zdlb": "h5",
		token: getTokenStorage(),
		...config.header,
	}
	if (config.method === 'GET') {
		config.params = {
			...config.params,
		}
	}
	if (config.method === 'POST') {
		config.data = {
			...config.data,
		}
	}
	/*
 if (!token) { // 如果token不存在，return Promise.reject(config) 会取消本次请求
   return Promise.reject(config)
 }
 */
	return config
}, (config) => {
	return Promise.reject(config)
})

http.interceptors.response.use(async (response) => {
	/* 对响应成功做点什么 可使用async await 做异步操作*/
	//  if (response.data.code !== 200) { // 服务端返回的状态码不等于200，则reject()
	//    return Promise.reject(response) // return Promise.reject 可使promise状态进入catch
	// if (response.config.custom.verification) { // 演示自定义参数的作用
	//   return response.data
	// }
	uni.hideLoading();
	if (response.data.code == 0) {
		if (response.data.data.businessCode != 1000) {
			uni.showToast({
				icon: 'none',
				title: response.data.data.msg
			});
		}
	}
	return response
}, (response) => { // 请求错误做点什么。可以使用async await 做异步操作
	uni.hideLoading();
	if (response.errMsg == 'request:fail ') {
		uni.showToast({
			icon: 'none',
			title: '网络请求失败，请检查网络连接！',
		});
	} else {
		let errorMsg = "未知错误"
		for (var key in errorCode) {
			let errorCode = Number(key) as ErrorCodeKey;
			if (Number(key) == response.statusCode) {
				errorMsg = getErrorCode(errorCode, response.data.msg)
			}
		}
		uni.showToast({
			icon: 'none',
			mask: true,
			title: errorMsg,
		});
		setTimeout(() => {
			if (response.statusCode === 403) {
				uni.reLaunch({
					url: '/pages/login/view/index'
				});
			} else {
			}
		}, 1000)
	}
	return Promise.reject(response)
})

export {
	http
}
